home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 46 / Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso / -serious- / programming / other / tandem / teaching / 26.asm < prev    next >
Assembly Source File  |  1999-09-06  |  5KB  |  119 lines

  1. * 26.asm      Open a window          version 0.00    1.9.97
  2.  
  3. ; This program does what Teaching/20.asm did, and then opens a window.
  4. ; it also sets up an IDCMP port (see the IDCMP section under intuition
  5. ; i/o methods in the ROM Kernal manual). The only IDCMP message
  6. ; receivable is the close gadget, so the program waits until you click
  7. ; the close gadget, and then closes the window & screen, and exits.
  8.  
  9. ; Notice that you can resize and move the window, of which your program is
  10. ; oblivious, before you click the close gadget. If your program needed to
  11. ; know that the window is moved and/or resized, you could arrange to get
  12. ; IDCMP messages for that.
  13.  
  14. ; For tag details, see the autodoc for OpenWindow
  15.  
  16. ; You will see later that there is a simpler way to open a window using
  17. ; Front.i; so this program is simply for instructional purposes. Note the
  18. ; way putting OpenScreen & OpenWindow in subroutines makes the logic of
  19. ; Program easier to follow.
  20.  
  21.  include 'Front.i'        ;*** save to Tandem.i if stepping thru TL's ***
  22.  
  23. strings: dc.b 0
  24. st_1: dc.b 'My screen',0   ;1
  25. st_2: dc.b 'My window (click the close gadget)',0   ;2
  26.  ds.w 0
  27.  
  28. screen: ds.l 1             ;screen opened by Screen
  29. window: ds.l 1             ;window opened by Window
  30.  
  31. pens: dc.l -1              ;default pens structure
  32.  
  33. * open screen & window; close & exit when close gadget clicked
  34. Program:
  35.  bsr OpenScreen            ;open a screen
  36.  beq.s Pr_bad              ;bad if couldn't
  37.  bsr OpenWindow            ;open a window on the screen
  38.  beq.s Pr_close            ;bad if couldn't (unlikely)
  39.  move.l window,a2
  40.  move.l wd_UserPort(a2),a0 ;point to the port for IDCMP messages
  41.  move.l xxp_sysb(a4),a6
  42.  jsr _LVOWaitPort(a6)      ;wait for an IDCMP message to appear
  43.  move.l wd_UserPort(a2),a0
  44.  jsr _LVOGetMsg(a6)        ;get the message
  45.  move.l d0,a1
  46.  jsr _LVOReplyMsg(a6)      ;reply without inspection - must be close window
  47.  move.l xxp_intb(a4),a6    ;closewindow gadget clicked, so close window
  48.  move.l window,a0
  49.  jsr _LVOCloseWindow(a6)   ;(this deletes any un-got messages)
  50. Pr_close:
  51.  move.l xxp_intb(a4),a6    ;close the screen (no windows must be open)
  52.  move.l screen,a0
  53.  jsr _LVOCloseScreen(a6)
  54.  rts                       ;& return ok
  55. Pr_bad:
  56.  move.l xxp_intb(a4),a6
  57.  sub.l a0,a0
  58.  jsr _LVODisplayBeep(a6)   ;if bad, beep existing screens
  59.  rts                       ;& return bad
  60.  
  61. * open a screen
  62. OpenScreen:
  63.  sub.l #6*8+4,a7           ;room for 6 tags (8 bytes per tag + 4 at end)
  64.  move.l a7,a0
  65.  move.l #SA_Width,(a0)+    ; 1st tag: width=640
  66.  move.l #STDSCREENWIDTH,(a0)+
  67.  move.l #SA_Height,(a0)+   ; 2nd tag: height=200/256
  68.  move.l #STDSCREENHEIGHT,(a0)+
  69.  move.l #SA_Depth,(a0)+    ; 3rd tag: depth=2
  70.  move.l #2,(a0)+
  71.  move.l #SA_Pens,(a0)+     ; 4th tag: pass SA_Pens to get new look
  72.  move.l #pens,(a0)+
  73.  move.l #SA_Title,(a0)+    ; 5th tag: send title
  74.  move.l #st_1,(a0)+
  75.  move.l #SA_DisplayID,(a0)+ ; 6th tag: display (hires)
  76.  move.l #HIRES_KEY,(a0)+
  77.  move.l #TAG_DONE,(a0)     ;delimit tag list
  78.  move.l xxp_intb(a4),a6
  79.  sub.l a0,a0               ;a0 is null, since no NewScreen structure
  80.  move.l a7,a1              ;a1 points to taglist
  81.  jsr _LVOOpenScreenTagList(a6) ;open screen
  82.  add.l #6*8+4,a7           ;discard tag list, restore stack
  83.  move.l d0,screen
  84.  rts                       ;EQ if bad
  85.  
  86. * open a window on the screen already opened
  87. OpenWindow:
  88.  sub.l #10*8+4,a7          ;room for 10 tags
  89.  move.l a7,a0
  90.  move.l #WA_Left,(a0)+     ; 1st tag: left posn
  91.  move.l #100,(a0)+
  92.  move.l #WA_Top,(a0)+      ; 2nd tag: top posn
  93.  move.l #30,(a0)+
  94.  move.l #WA_Width,(a0)+    ; 3rd tag: width
  95.  move.l #400,(a0)+
  96.  move.l #WA_Height,(a0)+   ; 4th tag: height
  97.  move.l #150,(a0)+
  98.  move.l #WA_Flags,(a0)+    ; 5th tag: flags (system gadgets)
  99. 1$: equ WFLG_CLOSEGADGET!WFLG_SIZEGADGET!WFLG_DRAGBAR!WFLG_DEPTHGADGET
  100.  move.l #1$,(a0)+
  101.  move.l #WA_IDCMP,(a0)+    ; 6th tag: IDCMP (only signal if window closes)
  102.  move.l #IDCMP_CLOSEWINDOW,(a0)+
  103.  move.l #WA_Title,(a0)+    ; 7th tag: widow title
  104.  move.l #st_2,(a0)+
  105.  move.l #WA_CustomScreen,(a0)+ ; 8th flag: screen pointer
  106.  move.l screen,(a0)+
  107.  move.l #WA_MinWidth,(a0)+ ; 9th flag: minimum width
  108.  move.l #200,(a0)+
  109.  move.l #WA_MinHeight,(a0)+ ; 10th flag: minimum height
  110.  move.l #20,(a0)+
  111.  move.l #TAG_DONE,(a0)     ;delimit tag list
  112.  move.l xxp_intb(a4),a6
  113.  sub.l a0,a0               ;no NewWindow structure
  114.  move.l a7,a1              ;point to taglist
  115.  jsr _LVOOpenWindowTagList(a6) ;open window
  116.  add.l #10*8+4,a7          ;discard flags, restore stack
  117.  move.l d0,window          ;remember window structure address
  118.  rts                       ;EQ if bad, NE if good
  119.